package com.obelisco.vista.plantillas;

import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;
import java.util.Vector;

import javax.mail.MessagingException;

import net.sf.jasperreports.engine.JRException;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.FillImageBorder;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.SplitPane;
import nextapp.echo2.extras.app.BorderPane;
import nextapp.echo2.extras.app.TabPane;

import com.obelisco.modelo.data.Operacion;
import com.obelisco.vista.componentes.BarraHerramientas;
import com.obelisco.vista.componentes.BarraHerramientasListener;
import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.ComponenteEnviarListener;
import com.obelisco.vista.componentes.ComponenteImprimirListener;
import com.obelisco.vista.componentes.IProcesadorReporte;
import com.obelisco.vista.componentes.TipoAccion;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.componentes.TipoVentana;
import com.obelisco.vista.componentes.Ventana;
import com.obelisco.vista.controles.BotonFuncion;
import com.obelisco.vista.herramientas.EmailUtils;
import com.obelisco.vista.herramientas.ImpresionUtils;
import com.obelisco.vista.util.BarraHerramientasHelper;

import echopointng.ContentPaneEx;
import echopointng.ExtentEx;
import echopointng.layout.DisplayLayoutData;

public abstract class VentanaBase extends Ventana {
	
	protected Vector<ComponenteDatosListener> listeners = new Vector<ComponenteDatosListener>();
	
	protected Vector<ComponenteImprimirListener> listenersImprimir = new Vector<ComponenteImprimirListener>();
	
	protected Vector<ComponenteEnviarListener> listenersEnviar = new Vector<ComponenteEnviarListener>();
	
	protected Object servicio;

	private BarraHerramientas barraHerramientas;
	
	//private String metodoExcepcion;

	private TipoVentana tipoVentana;

	private Component areaTrabajo;

	private boolean usarTab = true;

	private ContentPaneEx contenido;
	
	private ContentPaneEx panelContenido;
	
	private IProcesadorReporte procesadorReporte;
	
	protected boolean mostrarAceptar;
	
	protected boolean mostrarCancelar;
	
	//private String archivoReporte;

	private EmailUtils emailUtils;
	
	
	public IProcesadorReporte getProcesadorReporte() {
		return procesadorReporte;
	}

	public void setProcesadorReporte(IProcesadorReporte procesadorReporte) {
		this.procesadorReporte = procesadorReporte;
	}

	public VentanaBase(String titulo, TipoVentana tipo) {
		super(titulo);
		this.tipoVentana = tipo;
		initComponents();
	}
	
	public VentanaBase(TipoVentana tipo) {
		super();
		this.tipoVentana = tipo;
		initComponents();
	}
	
	protected abstract void funcion(TipoFuncion funcion, String nombre);

	protected abstract void accion(TipoAccion accion, TipoFuncion funcion, String nombre);
	
	/*public boolean onValidarExcepcion()
	{
		boolean isValido = true;
		try {
			if (metodoExcepcion != null)
			{
				String nombreMetodo = metodoExcepcion;
				isValido = (Boolean)MethodUtils.invokeMethod(servicio, nombreMetodo,null);
			}
			else
			{
				isValido = true;
			}
		}
		catch (Exception ivokEx) {
			ivokEx.printStackTrace();			
		}		
		return isValido;			
	}*/
	
	//public abstract boolean onValidarExcepcion();

	// protected abstract boolean validarFuncion(TipoFuncion funcion, String
	// nombre);

	private BarraHerramientasListener eventosBarra = new BarraHerramientasListener() {

		public void beforeOnAccion(TipoAccion accion, TipoFuncion funcion, String nombre) {

		}

		public void beforeOnFuncion(TipoFuncion funcion, String nombre) {

		}

		public void onAccion(TipoAccion accion, TipoFuncion funcion, String nombre) {			
			accion(accion, funcion, nombre);
		}

		public void onFuncion(TipoFuncion funcion, String nombre) {
			funcion(funcion, nombre);
		}

		public void onSalir(TipoFuncion funcion, String nombre) {
			// TODO Auto-generated method stub
		}

	};

	private void crearAreaTrabajo() {
		panelContenido.removeAll();
		if (usarTab) {

			areaTrabajo = new TabPane();
			areaTrabajo.setStyleName("Obelisco.TabPaneAreaTrabajo");
		} else {

			areaTrabajo = new ContentPaneEx();
			//areaTrabajo.setStyleName("Obelisco.ContentPaneEx");
		
			areaTrabajo = new BorderPane();
			FillImageBorder fillImageBorder1 = new FillImageBorder(null, null,new Insets(new Extent(10, Extent.PX),	new Extent(20, Extent.PX), new Extent(10, Extent.PX),new Extent(10, Extent.PX)));
			((BorderPane) areaTrabajo).setBorder(fillImageBorder1);


			//DisplayLayoutData layoutData = new DisplayLayoutData();
//			layoutData.setHeight(new ExtentEx("100%"));
//			layoutData.setWidth(new ExtentEx("100%"));
			//layoutData.setInsets(new Insets(new Extent(10)));
			
			//areaTrabajo.setLayoutData(layoutData);


		}
		panelContenido.add(areaTrabajo);
	}

	private void initComponents() {
		
		contenido = new ContentPaneEx();

		DisplayLayoutData layoutData = new DisplayLayoutData();
		layoutData.setHeight(new ExtentEx("100%"));
		layoutData.setWidth(new ExtentEx("100%"));
		contenido.setLayoutData(layoutData);
		
		SplitPane splitPane = new SplitPane();
		splitPane.setOrientation(SplitPane.ORIENTATION_VERTICAL_TOP_BOTTOM);
		splitPane.setSeparatorPosition(new Extent(40, Extent.PX));
		contenido.add(splitPane);
		
		ContentPaneEx paneSuperior = new ContentPaneEx();
		splitPane.add(paneSuperior);
		
		ContentPaneEx paneInferior = new ContentPaneEx();
		splitPane.add(paneInferior);
		
		barraHerramientas = new BarraHerramientas();
		barraHerramientas.setTipo(tipoVentana);
		this.barraHerramientas.addBarraHerramientasListener(eventosBarra);
		paneSuperior.add(barraHerramientas);

		panelContenido = new ContentPaneEx();
		layoutData = new DisplayLayoutData();
		layoutData.setHeight(new ExtentEx("100%"));
		layoutData.setWidth(new ExtentEx("100%"));
		panelContenido.setLayoutData(layoutData);

		paneInferior.add(panelContenido);

		crearAreaTrabajo();

		add(contenido);
	}

	public Component getAreaTrabajo() {
		return areaTrabajo;
	}

	public TipoVentana getTipoVentana() {
		return tipoVentana;
	}

	public BarraHerramientas getBarraHerramientas() {
		return barraHerramientas;
	}

	public boolean isUsarTab() {
		return usarTab;
	}

	public void setUsarTab(boolean usarTab) {
		this.usarTab = usarTab;
		crearAreaTrabajo();
	}
	
	
	public Object getServicio() {
		return servicio;
	}

	public void setServicio(Object servicio) {
		this.servicio = servicio;
	}
	
	public void setFunciones(Set<Operacion> funciones) {		
		Vector<BotonFuncion> botonesFuncion = BarraHerramientasHelper.getBotonesFuncion(funciones);
		Collections.sort(botonesFuncion, new ordenarBotones());
		getBarraHerramientas().setFunciones(botonesFuncion); 	
	}
	 
	public void setTextoAyuda(String ayuda) {
		getBarraHerramientas().setTextoAyuda(ayuda);
	}
	
	public void onImprimir() {		
		if (listenersImprimir.size() > 0)
		{
			ComponenteImprimirListener listenerImpr = listenersImprimir.get(0);			
			if (listenerImpr.rutaArchivoReporte() != null) {
				ImpresionUtils.imprimir(null, listenerImpr.extraerParametros(),procesadorReporte, listenerImpr.rutaArchivoReporte(), this);					
			}
		}
	}
	
	public void onEnviar() throws MessagingException, JRException, IOException {
		if (!listenersEnviar.isEmpty()) {
			ComponenteEnviarListener listenerEnviar = listenersEnviar.get(0);
			if (listenerEnviar.rutaArchivoReporte() != null) {
				emailUtils.enviar(null, listenerEnviar.extraerParametros(),
						procesadorReporte, listenerEnviar.rutaArchivoReporte(),
						listenerEnviar.direccionRemitente(), listenerEnviar.direccionDestinatario(),
						listenerEnviar.asunto(), listenerEnviar.cuerpo(), this);
			}
		}
	}

	public boolean isMostrarAceptar() {
		return mostrarAceptar;
	}

	public void setMostrarAceptar(boolean mostrarAceptar) {
		this.mostrarAceptar = mostrarAceptar;
		barraHerramientas.setMostrarAceptar(mostrarAceptar);
	}

	public boolean isMostrarCancelar() {
		return mostrarCancelar;
	}

	public void setMostrarCancelar(boolean mostrarCancelar) {
		this.mostrarCancelar = mostrarCancelar;
		barraHerramientas.setMostrarCancelar(mostrarCancelar);
	}

	public Vector<ComponenteImprimirListener> getListenersImprimir() {
		return listenersImprimir;
	}

	public void setListenersImprimir(
			Vector<ComponenteImprimirListener> listenersImprimir) {
		this.listenersImprimir = listenersImprimir;
	}

	public Vector<ComponenteEnviarListener> getListenersEnviar() {
		return listenersEnviar;
	}

	public void setListenersEnviar(Vector<ComponenteEnviarListener> listenersEnviar) {
		this.listenersEnviar = listenersEnviar;
	}

	public EmailUtils getEmailUtils() {
		return emailUtils;
	}

	public void setEmailUtils(EmailUtils emailUtils) {
		this.emailUtils = emailUtils;
	}
		
}

class ordenarBotones implements Comparator<BotonFuncion> {

	public int compare(BotonFuncion botonFuncion1, BotonFuncion botonFuncion2) {
		return botonFuncion1.getNombreOrdenar().compareTo(botonFuncion2.getNombreOrdenar());
	}
	
}
